[新機能]dbt Cloudで本番環境とのdefer(差分)を取得して新規開発したモデルだけを開発環境でbuildできるようになりました
さがらです。
dbt Cloudで、本番環境とのdefer(差分)を取得して新規開発したモデルだけを開発環境でbuildできるようになりました。
早速試してみたので、本記事でその内容をまとめてみます。
試す内容
こちらのアップデートはまだ公式Docのリリースノートにも反映されていないですが、dbtのコミュニティSlackで下図の投稿がありました。
この投稿に併せて、Loomでの動画も投稿されていました。こちらの動画で行っているようなことを、私も試してみました。
事前準備
使用するdbtのバージョンは「1.6」以上に
本機能は使用するdbtのバージョンが1.6以上でないと使用できないため、ご注意ください。
開発環境・本番環境、どちらのEnvironmentでも1.6以上を使用する必要があります。
Defer取得対象のEnvironmentを「Production」に設定
まず、Defer取得対象の本番環境に該当するEnvironmentでSet as Production environment
を押し、対象のEnvironmentをProduction環境であると明示的にします。
有効化されると、Environmentsの一覧で対象のEnvironmentにProduction
と表示されるようになります。
IDEでDefer to productionを有効化する
IDE上の右下にDefer to production
があるため、これを有効化します。
試してみた
前提条件
本番環境にあたるスキーマPRODUCTION
ではすべてのModelをBuildしており、開発環境にあたるスキーマDBT_SSAGARA
ではまだ一つのModelもBuildしていない状態とします。
この状態で、開発環境で新しく開発したModelcustomers_no2.sql
とcustomers_no3.sql
をIDE上で各コマンドを用いてBuildしてみます。※この2つのModelはどちらも同じSQLで構成されています。
customers_no2
とcustomers_no3
はstg_customers
を親に持つため、今回リリースされた新機能を用いてstg_customers
を開発環境でBuildしなくてもcustomers_no2
とcustomers_no3
をBuildできるのかを確認してみます。
検証その1:シンプルに新しく開発したModelだけをBuildする場合
まずはシンプルに、新しく開発したModelだけをBuildしてみます。
dbt build --select customers_no2
を実行してみます。
すると、親モデルであるstg_customers
は本番環境のスキーマであるPRODUCTION
上のViewを参照して、customers_no2
がBuildされました!
検証その2:state:modifiedを入れた場合
続いて、dbt build --select state:modified
を実行して差分があるModelだけを実行してみます。
すると、本番環境と差分があるcustomers_no2
とcustomers_no3
だけがBuildされました!親モデルであるstg_customers
は本番環境のスキーマであるPRODUCTION
上のViewを参照しています。
検証その3:開発環境で親モデルであるstg_customers
を一度Buildしている場合
次はちょっと経路を変えて、開発環境で親モデルであるstg_customers
を一度Buildしている場合を検証してみます。
この状態で検証その2で実行したdbt build --select state:modified
を実行すると、本番環境と差分があるcustomers_no2
とcustomers_no3
だけがBuildされるのですが、参照している親モデルはdbt_ssagara
という開発環境のスキーマになります。target=dev
の場合にレコード数を絞り込んで開発環境のスキーマでModelをBuildしている場合には、この方が良いケースだと思います。
もし、開発環境のスキーマでBuild済みの親モデルを無視して本番環境のスキーマでBuildされたModelを参照したい場合は、dbt build --select state:modified --favor-state
を実行しましょう。
--favor-state
をつけることで、選択したstateを優先するようになるみたいです。(正直私も詳しいことはわからないのですが、公式Docにそのようなことが書いてあります…)
ということで、dbt build --select state:modified --favor-state
を実行すると、下図のように開発環境のスキーマでBuild済みの親モデルを無視して本番環境のスキーマであるPRODUCTION
でBuildされたModelを参照されます。
最後に
dbt Cloudで、本番環境とのdefer(差分)を取得して新規開発したモデルだけを開発環境でbuildできるようになったのでその機能を試してみました。
開発環境で不要なモデルをBuildせずに開発できるので、DWHのリソースも節約できてとても便利な機能だと思います!ぜひ活用ください。